
//一、命名函数

//    无参无返回值
/*
function method1(){
    var n1 = 10;
    var n2 = 20;
    var n3 = n1 + n2;
    alert(n3);
}
*/
//调用
//method1();

//    无参有返回值
/*
function method2(){
    var n1;
    var n2 = 20;
    if(!n1){
        return;
    }
    var n3 = n1 + n2;
    var arr = [n1,n2,n3];
    return n3;
}
//调用
var result = method2();
alert("函数外输出：" + result);
*/

//有参无返回值
/*
function method3(n1, n2){ 
    var n3 = n1 + n2;
    alert(n3);
}
*/
//调用
//method3(10,20);

//有参有返回值
/*
function method4(...param){
    console.log(param);
    console.log("第一个参数为：" + param[0])
    return "返回值";
}
var bl2 = method4;
*/
//调用
// var result = method4(10);
// console.log("结果：" + result);


//二、匿名函数

//      无参无返回
// var bl = function(){
//     console.log("调用匿名函数");
// }
// bl();

//      有参有返回值
/*
var bl = function(n1,n2){
    var n3 = n1 + n2;
    return n3;
}
// var result = bl(10,20);
// console.log(result);

console.log("类型：" + typeof(bl));
console.log("值：\n" + bl);

console.log("类型：" + typeof(method4));
//console.log("值：\n" + method4);
console.log(bl2)
*/


//三、动态函数
/*
var bl = new Function("n1","n2","return n1+n2");
//调用
var result = bl(10,20);
console.log(result);
*/

//匿名函数自调用
/*
(function(){
    alert("调用匿名函数");
})();
*/
//命名函数自调用
/*
var result = (function fn(n1){
    console.log("调用命名函数");
    return n1;
})(10);

console.log(result);
*/

//函数作为类型来使用
/*
function fn1(){
    console.log('执行fn1函数！');
    return "fn1函数"
}

//将fn1最为参数，表示传递整个fn1函数对象数据
function fn2(hs){
    console.log('执行fn2函数！');
    console.log(hs);
    var result = hs();
    console.log(result);
    return result;
}
//调用
var jg = fn2(fn1);
console.log(jg);

//传递函数值
function fn3(cs){
    console.log(cs);
}
//实际传递的不是fn1函数对象，而是fn1函数的返回结果
fn3(fn1());
*/

//函数作为返回值来使用
/*
function fn1(){
    // return fn2;
    // return function(){
    //     console.log('返回匿名函数');
    // }
    return nm;

}
function fn2(){
    console.log('执行fn2函数');
}
var nm = function(){
    console.log('返回匿名函数');
}


var result = fn1();
console.log(result);
console.log(typeof result);
result();
*/

/*
{
    var num = 10;
    console.log(num);
}
console.log(num);
if(true){
    var num2 = 20;
    console.log(num2);
}
console.log(num2);
for(var i=1; i<=1; i++){
    var num3 = 30;
    console.log(num3);
}
console.log(num3);
function test(){
    var num4 = 40;
    console.log(num4);
}
test();
console.log(num4);
*/

// function test(num){
//     num = 10;
//     console.log(num);
// }
// var n = 20;
// test(n);
// console.log(n);
// console.log(num);

//var num = 1;
//局部作用域链
/*
function f1(){
    //var num = 10;
    function f2(){
        //var num = 20;
        console.log(num);
    }
    f2();
}
f1();
*/

//块级作用域链
/*
{
    //let num = 10;
    {
        //let num = 20;
        console.log(num);
    }
}
*/
/*
console.log(num);
//全局作用域链
var num = 10;
//var num = 20;
console.log(num);
*/
// for(var i=1; i<=10; i++){

// }

// for(var i=1; i<=10; i++){
//     i= 10;
// }

t1();
function t1(){
    console.log(123);
}

console.log(nt);
var nt = 10;